#include "sqlitemanager.h"
#include "../constantapp.h"

#include <QSqlQuery>
#include <QSqlError>
#include <QSqlDatabase>
#include <QDebug>

 namespace Sqlite{
SqliteManager* SqliteManager::m_instance = NULL;

SqliteManager::SqliteManager(QObject *parent) :
    QObject(parent)
{
    init();
}

SqliteManager* SqliteManager::instance(QObject *parent){
    if(m_instance){
        return m_instance;
    }else
    {
        m_instance = new SqliteManager(parent);
    }
}

void SqliteManager::setDatabase(const QString nameDB)
{
    m_db.setDatabaseName( nameDB);

    if( !m_db.open() )
    {
        qFatal( "Failed to connect DB Name : " );
        qDebug() << nameDB ;
        return ;
    }

    qDebug() << "sqlite Connected!"  + nameDB;
}

void SqliteManager::init()
{
    qDebug() <<" SqliteManager::init()" ;
    m_db = QSqlDatabase::addDatabase( "QSQLITE" );
    m_db.setDatabaseName( PATH_SQLITE_ZINGME_CHAT_DB);
    if( !m_db.open() )
    {
        // qDebug() << db.lastError();
        qFatal( "Failed to connect." );
        qDebug() << "create database " ;
        return ;
    }

    qDebug() << "sqlite Connected!"  ;



//    qry.prepare( "CREATE TABLE IF NOT EXISTS category (id INTEGER UNIQUE PRIMARY KEY, name NVARCHAR(100))" );


//    qry.prepare("CREATE TABLE IF NOT EXISTS source (id INTEGER UNIQUE PRIMARY KEY, name NVARCHAR(100), image VARCHAR(100))");
//    doProcessSQLQuery(qry);


//    qry.prepare("CREATE TABLE IF NOT EXISTS source_category (sourceid INTEGER , categoryid INTEGER )");
//    doProcessSQLQuery(qry);


//    qry.prepare("CREATE TABLE IF NOT EXISTS article (id INTEGER UNIQUE PRIMARY KEY, title Text, description Text, posttime INTEGER, smallThumbnail Text, linkImage VARCHAR(100), cid INTEGER, sid INTEGER  )");
//    doProcessSQLQuery(qry);



    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (2, 'Jane', 'Doe')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Inserted!" );

    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (3, 'James', 'Doe')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Inserted!" );

    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (4, 'Judy', 'Doe')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Inserted!" );

    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (5, 'Richard', 'Roe')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Inserted!" );

    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (6, 'Jane', 'Roe')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Inserted!" );

    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (7, 'John', 'Noakes')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Inserted!" );

    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (8, 'Donna', 'Doe')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Inserted!" );

    //    qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (9, 'Ralph', 'Roe')" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    elseAppChat
    //        qDebug( "Inserted!" );

    //    qry.prepare( "SELECT * FROM names" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //    {
    //        qDebug( "Selected!" );

    //        QSqlRecord rec = qry.record();

    //        int cols = rec.count();

    //        for( int c=0; c<cols; c++ )
    //            qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );

    //        for( int r=0; qry.next(); r++ )
    //            for( int c=0; c<cols; c++ )
    //                qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
    //    }


    //    qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = 'Roe'" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //    {
    //        qDebug( "Selected!" );

    //        QSqlRecord rec = qry.record();

    //        int cols = rec.count();

    //        for( int c=0; c<cols; c++ )
    //            qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );

    //        for( int r=0; qry.next(); r++ )
    //            for( int c=0; c<cols; c++ )
    //                qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
    //    }


    //    qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = 'Roe' ORDER BY firstname" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //    {
    //        qDebug( "Selected!" );

    //        QSqlRecord rec = qry.record();

    //        int cols = rec.count();

    //        for( int c=0; c<cols; c++ )
    //            qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );

    //        for( int r=0; qry.next(); r++ )
    //            for( int c=0; c<cols; c++ )
    //                qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
    //    }


    //    qry.prepare( "SELECT lastname, COUNT(*) as 'members' FROM names GROUP BY lastname ORDER BY lastname" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //    {qry.prepare("CREATE TABLE IF NOT EXISTS article (id INTEGER UNIQUE PRIMARY KEY, title Text, description Text, posttime INTEGER, smallThumbnail Text, linkImage VARCHAR(100), cid INTEGER, sid INTEGER  )");
    //doProcessSQLQuery(qry);
    //        qDebug( "Selected!" );

    //        QSqlRecord rec = qry.record();

    //        int cols = rec.count();

    //        for( int c=0; c<cols; c++ )
    //            qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );

    //        for( int r=0; qry.next(); r++ )
    //            for( int c=0; c<cols; c++ )
    //                qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
    //    }init

    //    qry.prepare( "UPDATE names SET firstname = 'Nisse', lastname = 'Svensson' WHERE id = 7" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Updated!" );

    //    qry.prepare( "UPDATE names SET lastname = 'Johnson' WHERE firstname = 'Jane'" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Updated!" );

    //    qry.prepare( "DELETE FROM names WHERE id = 7" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Deleted!" );

    //    qry.prepare( "DELETE FROM names WHERE lastname = 'Johnson'" );
    //    if( !qry.exec() )
    //        qDebug() << qry.lastError();
    //    else
    //        qDebug( "Deleted!" );


   // m_db.close();
}

//void NewspaperSqlManager::insertSourceInfo(const SourceInfo& sourceInfo)
//{

//    QString strQry = QString("INSERT INTO source (id, name) VALUES ( %1 , ' %2 ')").arg(sourceInfo.id()).arg(sourceInfo.name());
//    QSqlQuery qry;

//    qry.prepare(strQry);
//    doProcessSQLQuery(qry);
//}

//void NewspaperSqlManager::insertCategoryInfo(const CategoryDetail *categoryDetail)
//{
//   // QString strQry = "INSERT INTO category (id, name) VALUES ("+ sourceInfo->id()+ ", '"+ sourceInfo->name()+ "')";
//   // QSqlQuery qry;
//   // qry.prepare(strQry);
//   // doProcessSQLQuery(qry);


//}


void SqliteManager::doProcessSQLQuery(QSqlQuery& query)
{
    qDebug() << "SqliteManager::doProcessSQLQuery";

    if(m_db.isOpen())  {
        if( !query.exec() )
            qDebug() <<  "???????????????????????????SqliteManager::doProcessSQLQuery" << query.lastError();
        //else
        //    qDebug() << "doProcessSQLQuery ok";
        //m_db.commit();

    } else {
        qDebug() << "QSqlite open failse";
    }
}

}
